/**
 * UI 辅助工具函数
 */

/**
 * 防抖函数 - 防止用户快速点击
 * @param {Function} func 要执行的函数
 * @param {number} delay 延迟时间(ms)
 * @returns {Function} 防抖后的函数
 */
function debounce(func, delay = 300) {
  let timer = null;
  return function(...args) {
    if (timer) clearTimeout(timer);
    timer = setTimeout(() => {
      func.apply(this, args);
      timer = null;
    }, delay);
  };
}

/**
 * 节流函数 - 限制函数执行频率
 * @param {Function} func 要执行的函数
 * @param {number} delay 间隔时间(ms)
 * @returns {Function} 节流后的函数
 */
function throttle(func, delay = 300) {
  let timer = null;
  return function(...args) {
    if (timer) return;
    timer = setTimeout(() => {
      func.apply(this, args);
      timer = null;
    }, delay);
  };
}

/**
 * 安全的页面跳转 - 防止重复跳转
 * @param {string} url 跳转地址
 * @param {object} options 跳转选项
 */
function safeNavigateTo(url, options = {}) {
  // 检查是否已经在跳转中
  if (this._navigating) return;
  
  this._navigating = true;
  
  wx.navigateTo({
    url,
    ...options,
    complete: () => {
      // 延迟重置标志，防止页面跳转动画期间再次触发
      setTimeout(() => {
        this._navigating = false;
      }, 500);
    }
  });
}

/**
 * 显示加载提示
 * @param {string} title 提示文字
 * @param {boolean} mask 是否显示遮罩
 */
function showLoading(title = '加载中...', mask = true) {
  wx.showLoading({ title, mask });
}

/**
 * 隐藏加载提示
 */
function hideLoading() {
  wx.hideLoading();
}

/**
 * 显示成功提示
 * @param {string} title 提示文字
 * @param {number} duration 持续时间
 */
function showSuccess(title, duration = 2000) {
  wx.showToast({
    title,
    icon: 'success',
    duration
  });
}

/**
 * 显示错误提示
 * @param {string} title 提示文字
 * @param {number} duration 持续时间
 */
function showError(title, duration = 2000) {
  wx.showToast({
    title,
    icon: 'none',
    duration
  });
}

/**
 * 显示确认对话框
 * @param {string} title 标题
 * @param {string} content 内容
 * @param {string} confirmText 确认按钮文字
 * @param {string} cancelText 取消按钮文字
 * @returns {Promise<boolean>} 是否确认
 */
function showConfirm(title, content, confirmText = '确定', cancelText = '取消') {
  return new Promise((resolve) => {
    wx.showModal({
      title,
      content,
      confirmText,
      cancelText,
      success: (res) => {
        resolve(res.confirm);
      },
      fail: () => {
        resolve(false);
      }
    });
  });
}

/**
 * 格式化时间
 * @param {string|Date} time 时间
 * @returns {string} 格式化后的时间
 */
function formatTime(time) {
  if (!time) return '';
  
  const date = new Date(time);
  const now = new Date();
  const diff = now - date;
  
  // 小于1分钟
  if (diff < 60000) {
    return '刚刚';
  }
  
  // 小于1小时
  if (diff < 3600000) {
    return `${Math.floor(diff / 60000)}分钟前`;
  }
  
  // 小于24小时
  if (diff < 86400000) {
    return `${Math.floor(diff / 3600000)}小时前`;
  }
  
  // 小于7天
  if (diff < 604800000) {
    return `${Math.floor(diff / 86400000)}天前`;
  }
  
  // 超过7天显示具体日期
  return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
}

/**
 * 检查网络状态
 * @returns {Promise<boolean>} 是否有网络
 */
function checkNetwork() {
  return new Promise((resolve) => {
    wx.getNetworkType({
      success: (res) => {
        resolve(res.networkType !== 'none');
      },
      fail: () => {
        resolve(false);
      }
    });
  });
}

module.exports = {
  debounce,
  throttle,
  safeNavigateTo,
  showLoading,
  hideLoading,
  showSuccess,
  showError,
  showConfirm,
  formatTime,
  checkNetwork
};
